#include "Map.h"

#include <iostream>

using namespace std;
using namespace sf;

// Constructeur
Map::Map(string filename) {
	fileName = filename;
	loadMap();
}

bool Map::finFichier() {
	return mapFile.peek() == EOF;
}

void Map::loadMap() {
	mapFile.open(fileName.c_str(), ios_base::in);
	string	line;
	int		lCounter = 0;

	while ( lCounter <= 5 && ! finFichier() ) {
		getline(mapFile, line);
		lCounter++;

		switch (lCounter) {
			case 1:
				name = line;
				break;
			case 2:
				des = line;
				break;
			case 3:
				x = atoi(line.c_str());
				break;
			case 4:
				y = atoi(line.c_str());
				break;
			case 5:
				ground = "Images/grounds/" + line + ".png";
				break;
		}

	}
	cout << x << " " << y << endl;

	imgMap.Create(x * 32, y * 32);
	Image imgGround;
	imgGround.LoadFromFile(ground);

	for (int i = 0 ; i < x ; i++) {
		for (int j = 0 ; j < y ; j++) {
			imgMap.Copy(imgGround, i * 32, j * 32);
		}
	}


	blocks = new Block*[x];
	for (int i = 0 ; i < x ; i++) {
		blocks[i] = new Block[y];
	}

	for (int i = 0 ; i < x ; i++) {
		for (int j = 0 ; j < y ; j++) {
		}
	}

	for (int i = 0 ; i < x ; i++) {
		for (int j = 0 ; j < y ; j++) {
			blocks[i][j].setCoords(i, j);
		}
	}


	while ( ! finFichier() ) {
		getline(mapFile, line);
		if ( line == "BLOCK") {
			getline(mapFile, line);
			int bloc_x = atoi(line.c_str());
			getline(mapFile, line);
			int bloc_y = atoi(line.c_str());
			getline(mapFile, line);
			string bloc_img = line;
			blocks[bloc_x][bloc_y].setImage(bloc_img);
			blocks[bloc_x][bloc_y].setBlocked();
			blocks[bloc_x][bloc_y].setActive();
		} else if ( line == "FLOOR") {
			getline(mapFile, line);
			int bloc_x = atoi(line.c_str());
			getline(mapFile, line);
			int bloc_y = atoi(line.c_str());
			getline(mapFile, line);
			string bloc_img = line;
			blocks[bloc_x][bloc_y].setImage(bloc_img);
			blocks[bloc_x][bloc_y].setUnblocked();
			blocks[bloc_x][bloc_y].setActive();
		}
	}

	for (int i = 0 ; i < x ; i++) {
		for (int j = 0 ; j < y ; j++) {
			if ( blocks[i][j].isActive()) {
				imgMap.Copy(blocks[i][j].getImage(), i * 32, j * 32, IntRect(0, 0, 32, 32), true);
			}
		}
	}


	spriteMap.SetImage(imgMap);
}

bool Map::canMoveOn(int x_origin, int y_origin, int direction) {
	switch (direction) {
		case 0:
			if ( y_origin / 32 - 1 >= 0 ) {
				return not blocks[x_origin / 32 ][y_origin / 32 - 1].isBlocked();
			} else {
				return false;
			}
			break;
		case 1:
			if ( x_origin / 32 - 1 >= 0 ) {
				return not blocks[x_origin / 32 - 1][y_origin / 32].isBlocked();
			} else {
				return false;
			}
			break;
		case 2:
			if ( y_origin / 32 + 1 < y ) {
				return not blocks[x_origin / 32 ][y_origin / 32 + 1].isBlocked();
			} else {
				return false;
			}
			break;
		case 3:
			if ( x_origin / 32 + 1 < x ) {
				return not blocks[x_origin / 32 + 1][y_origin / 32].isBlocked();
			} else {
				return false;
			}
			break;
        default: return false; break;
	}

}

// Getters

string Map::getName() {
	return name;
}

string Map::getDescription() {
	return des;
}

int Map::getWidth() {
	return x;
}

int Map::getHeight() {
	return y;
}

Sprite Map::getSprite() {
	return spriteMap;
}

//bool Map::isBlock(int x, int y) {
//	return true;
//}

Block Map::getBlock(int x, int y) {
	return blocks[x][y];
}

// Setters

void Map::setMap(Map map) {

}

void Map::setPnj(int i, int j, bool b)
{
    blocks[i][j].setPnj(b);
}

bool Map::getPnj(int i, int j)
{
    return blocks[i][j].getPnj();
}

void Map::setZone(int x, int y, int largeur, int hauteur,string image)           // Pour le test x=10,y=0,largeur=3,hauteur=3.
{
Block block;
int save=y;

    for (int i=0;i<largeur;i++)                                     // On fait une boucle pour chaque blocs par la hauteur.
    {
        for(int j=0;j<hauteur;j++)                                  // Pour une hauteur donnée , on fait tous les blocs de la largeur donnée.
        {
            block = blocks[x][y];
            if (i==0 && j==0) block.setImage(image + "_topleft");                       // Haut gauche
            else if (i==largeur-1 && j==0) block.setImage(image + "_topright");         // Haut droite
            else if (i==0 && j==hauteur-1) block.setImage(image + "_botleft");          // Bas gauche
            else if (i==largeur-1 && j==hauteur-1) block.setImage(image + "_botright"); // Bas droite
            else block.setImage(image);
            block.setRencontre(true);                               // On annonce que les rencontres sont OK.
            setBlock(block, x, y);
            cout << "  x:" << x << "  y:"<<y<< " Zone :"<< blocks[x][y].isPossible() <<  endl;                // Message de confirmation.
            y++;                                                    // On incrémente.
        }
       y=save;                                                      // On reprend la coordonnée de "départ".
       x++;                                                         // On passe à la colone suivante.
    }
}

void Map::setBlock(Block b, int i, int j)
{
    blocks[i][j] = b;
    imgMap.Copy(blocks[i][j].getImage(), i * 32, j * 32, IntRect(0, 0, 32, 32), true);

}
